//
// DotNetNuke - http://www.dotnetnuke.com
// Copyright (c) 2002-2010
// by Perpetual Motion Interactive Systems Inc. ( http://www.perpetualmotion.ca )
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
// documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 
// to permit persons to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions 
// of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
// DEALINGS IN THE SOFTWARE.
//

using System;
using System.Collections.Generic;
using DotNetNuke.Entities.Modules;
using DotNetNuke.Entities.Modules.Actions;
using DotNetNuke.Security;
using DotNetNuke.Services.Scheduling;
namespace DotNetNuke.Modules.Admin.Scheduler
{
	partial class ViewScheduleStatus : PortalModuleBase, IActionable
	{
		private ScheduleStatus Status;
		private void BindData()
		{
			lblFreeThreads.Text = SchedulingProvider.Instance().GetFreeThreadCount().ToString();
			lblActiveThreads.Text = SchedulingProvider.Instance().GetActiveThreadCount().ToString();
			lblMaxThreads.Text = SchedulingProvider.Instance().GetMaxThreadCount().ToString();
			IList<ScheduleItem> arrScheduleQueue = SchedulingProvider.Instance().GetScheduleQueue();
			if (arrScheduleQueue.Count == 0) {
				pnlScheduleQueue.Visible = false;
			} else {
				Services.Localization.Localization.LocalizeDataGrid(ref dgScheduleQueue, this.LocalResourceFile);
				dgScheduleQueue.DataSource = arrScheduleQueue;
				dgScheduleQueue.DataBind();
			}
			IList<ScheduleItem> arrScheduleProcessing = SchedulingProvider.Instance().GetScheduleProcessing();
			if (arrScheduleProcessing.Count == 0) {
				pnlScheduleProcessing.Visible = false;
			} else {
				Services.Localization.Localization.LocalizeDataGrid(ref dgScheduleProcessing, this.LocalResourceFile);
				dgScheduleProcessing.DataSource = arrScheduleProcessing;
				dgScheduleProcessing.DataBind();
			}
			if (arrScheduleProcessing.Count == 0 && arrScheduleQueue.Count == 0) {
				string strMessage = Services.Localization.Localization.GetString("NoTasks", this.LocalResourceFile);
				UI.Skins.Skin.AddModuleMessage(this, strMessage, UI.Skins.Controls.ModuleMessage.ModuleMessageType.YellowWarning);
			}
		}
		private void BindStatus()
		{
			Status = SchedulingProvider.Instance().GetScheduleStatus();
			lblStatus.Text = Status.ToString();
            placeCommands.Visible = SchedulingProvider.SchedulerMode == SchedulerMode.TIMER_METHOD;
			if (Status == ScheduleStatus.STOPPED && SchedulingProvider.SchedulerMode != SchedulerMode.DISABLED) {
				cmdStart.Enabled = true;
				cmdStop.Enabled = false;
			}
			else if (Status == ScheduleStatus.WAITING_FOR_REQUEST || SchedulingProvider.SchedulerMode == SchedulerMode.DISABLED)
			{
				cmdStart.Enabled = false;
				cmdStop.Enabled = false;
			} else {
				cmdStart.Enabled = false;
				cmdStop.Enabled = true;
			}
		}
		protected string GetOverdueText(double OverdueBy)
		{
			if (OverdueBy > 0) {
				return OverdueBy.ToString();
			} else {
				return "";
			}
		}
		protected override void OnLoad(EventArgs e)
		{
			base.OnLoad(e);

			cmdCancel.Click += new EventHandler(cmdCancel_Click);
			cmdStart.Click += new EventHandler(cmdStart_Click);
			cmdStop.Click += new EventHandler(cmdStop_Click);

			try {
				if (SchedulingProvider.Enabled == true) {
					if (!Page.IsPostBack) {
						BindData();
						BindStatus();
					}
				} else {
					UI.Skins.Skin.AddModuleMessage(this, Services.Localization.Localization.GetString("DisabledMessage", this.LocalResourceFile), UI.Skins.Controls.ModuleMessage.ModuleMessageType.RedError);
					lblStatus.Text = Services.Localization.Localization.GetString("Disabled", this.LocalResourceFile);
					cmdStart.Enabled = false;
					cmdStop.Enabled = false;
					lblFreeThreads.Text = "0";
					lblActiveThreads.Text = "0";
					lblMaxThreads.Text = "0";
					pnlScheduleQueue.Visible = false;
					pnlScheduleProcessing.Visible = false;
				}
			} catch (Exception exc) {
				Services.Exceptions.Exceptions.ProcessModuleLoadException(this, exc);
			}
		}
		private void cmdStart_Click(System.Object sender, System.EventArgs e)
		{
			Services.Scheduling.SchedulingProvider.Instance().StartAndWaitForResponse();
			BindData();
			BindStatus();
		}
		private void cmdStop_Click(System.Object sender, System.EventArgs e)
		{
			SchedulingProvider.Instance().Halt(Services.Localization.Localization.GetString("ManuallyStopped", this.LocalResourceFile));
			BindData();
			BindStatus();
		}
		private void cmdCancel_Click(System.Object sender, System.EventArgs e)
		{
			Response.Redirect(Common.Globals.NavigateURL(), true);
		}
		public ModuleActionCollection ModuleActions {
			get {
				ModuleActionCollection Actions = new ModuleActionCollection();
				Actions.Add(GetNextActionID(), Services.Localization.Localization.GetString(ModuleActionType.AddContent, LocalResourceFile), ModuleActionType.AddContent, "", "add.gif", EditUrl(), false, SecurityAccessLevel.Admin, true, false);
				Actions.Add(GetNextActionID(), Services.Localization.Localization.GetString("ScheduleHistory.Action", LocalResourceFile), ModuleActionType.AddContent, "", "icon_profile_16px.gif", EditUrl("", "", "History"), false, SecurityAccessLevel.Host, true, false);
				return Actions;
			}
		}
	}
}
